package am.dal;

import am.dal.entity.AccountBookDb;
import am.exception.ArgumentNullException;
import am.exception.InvalidOperationException;

/**
 * 与数据库的账本实体交互的接口
 * 
 * @author tianever
 */
public interface BookDbOperator
{
    /**
     * 向数据库插入book表示的实体, 插入成功后给book分配一个Id
     * @param book 账本实体, 除了Id, 其他属性均存入数据库, 插入成功后由数据库分配给一个Id
     * @throws ArgumentNullException book为null
     * @throws 一些数据库的异常
     */
    void insertWithIdAssigned(AccountBookDb book) throws ArgumentNullException;

    /**
     * 更新数据库中与book对应的实体
     * @param book 账本实体, 与数据库中要更新的实体对应, 必须设置好Id
     * @throws ArgumentNullException book为null
     * @throws InvalidOperationException 数据库中不存在对应的实体
     * @throws 一些数据库异常
     */
    void update(AccountBookDb book) throws ArgumentNullException, InvalidOperationException;

    /**
     * 删除数据库中与book对应的实体
     * @param book 账本实体, 与数据库中的实体对应, 必须设置好Id
     * @throws ArgumentNullException book为null
     * @throws InvalidOperationException 数据库中不存在对应的实体
     * @throws 一些数据库异常
     */
    void delete(AccountBookDb book) throws ArgumentNullException, InvalidOperationException;

    /**
     * 从数据库中提取对应的实体填充book
     * @param book 账本实体, 与数据库中的实体对应, 必须设置好Id
     * @throws ArgumentNullException book为null
     * @throws InvalidOperationException 数据库中不存在对应的实体
     * @throws 一些数据库异常
     */
    void fill(AccountBookDb book) throws ArgumentNullException, InvalidOperationException;

    /**
     * 从数据库中提取所有的账本实体, 填充并返回
     * @return 由账本实体组成的数组, 若没有账本实体, 则返回空数组
     * @throws 一些数据库异常
     */
    AccountBookDb[] selectAll();
}
